package com.sxt.generator;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.apache.commons.lang3.StringUtils;

import javax.sql.DataSource;
import java.util.Scanner;

public class MyGode_Generator_Demo {

    public static void main(String[] args) {

    //1,全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");//获取项目的根目录,用于生成路径
            globalConfig.setActiveRecord(true)//是否支持AR模式
                    .setAuthor("作者")//作者
                    .setOutputDir(projectPath+"src/main/java")//生成路径:文件保存的路径,保存地址可以修改
                    .setOpen(true)//当代码生成完之后是否打开代码所在的文件夹
                    .setFileOverride(true)//文件覆盖
                    .setIdType(IdType.AUTO)//主键策略
                    .setServiceName("%sService")//设置生成的service接口的名称首字母是否为I
                                                //IUserService
                    .setSwagger2(true)//是否生成实体属性 Swagger2 注解
                    .setBaseResultMap(true)//生成基本的resultMap
                    .setBaseColumnList(true);//生成基本的SQL片段

    //2,数据源配置
        DataSourceConfig dsConfig = new DataSourceConfig();
        dsConfig.setDbType(DbType.MYSQL)//设置数据库类型
                .setDriverName("com.mysql.jdbc.Driver")
                .setUrl("jdbc:mysql://localhost:3306/数据库名?其他配置&其他配置")
                .setUsername("root")
                .setPassword("root");

    //4,包名策略配置
        PackageConfig pkConfig = new PackageConfig();
        pkConfig.setModuleName(scanner("模块名"))//模块名称自定义输入,scanner静态方法为读取控制台内容
                //.setModuleName("sys")//模块名称可以固定
                .setParent("com.sxt")//放置在哪个包下
                .setMapper("mapper")//dao
                .setService("service")//service
                .setServiceImpl("service.imp")//service.imp
                .setController("controller")//controller
                .setEntity("entity")//domain...entity...pojo
                .setXml("mapper.xml");//mapper.xml

    //3,策略配置GlobalConfig中
        StrategyConfig stConfig = new StrategyConfig();
        stConfig.setCapitalMode(true)//全局大写命名
                .setNaming(NamingStrategy.underline_to_camel)//设置表名的命名规范(驼峰命名)
                .setColumnNaming(NamingStrategy.underline_to_camel)//设置字段名的命名规范(驼峰命名)

                //设置生成的实体类继承的父类(一般不用)
                //.setSuperEntityClass("com.baomidou.ant.common.BaseEntity");
                .setEntityLombokModel(true)//是否启动lombok注解
                .setRestControllerStyle(true)//是否生成RestController注解

                // 设置生成Controller层的公共父类(一般不用)
                // .setSuperControllerClass("com.baomidou.ant.common.BaseController");

                // 写于父类中的公共字段(把表中的某些字段提取到父类中,可以多个,多个英文逗号分割)
                // .setSuperEntityColumns("id");

                //根据表数据库表名,设置要生成那些表的实体类,可以多个,如果注释(不设置)则代表生成所有(不支持模糊匹配)
                .setInclude(scanner("表名，多个英文逗号分割").split(","))
                //.setInclude("表名1","表名2","表名n")//生成n个表的实体类

                .setTablePrefix(pkConfig.getModuleName() + "_")//是否清除前序?sys_user-->User:sys_user-->SysUser
                //.setTablePrefix("sys_")

                //控制器映射连字符样式(驼峰转连字符,意思是开启合并因为下划线而拆分的字符,并把单词首字母大写)
                .setControllerMappingHyphenStyle(true);



    //5,整合配置
        AutoGenerator ag = new AutoGenerator();
        ag.setGlobalConfig(globalConfig)
                .setDataSource(dsConfig)
                .setStrategy(stConfig)
                .setPackageInfo(pkConfig);

    //6,执行
        ag.execute();


    }
    /**
     * <p>
     * 读取控制台内容
     * </p>
     */
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入" + tip + "：");
        System.out.println(help.toString());
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotEmpty(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "！");
    }
}